home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / amos / transi / lots_of_text.readme next >
Text File  |  1998-01-05  |  33KB  |  628 lines

  1.                               ---------------
  2.                               * Transitions *
  3.                               ---------------
  4.  
  5.   This article and the accompanying  program  were  written by Ragnar Fyri,
  6. who also claims to be the  copyright  holder.  You  may use the routines in
  7. your own (non-commercial) programs on the  condition that you mention some-
  8. where in the program or documentation where they come from, and send Ragnar
  9. a copy. For other use of either the article  or software (either in full or
  10. in part) beyond that it is recommended  that you get in touch first and ob-
  11. tain permission to do whatever it is you  are planning to do. Before you do
  12. it, that is...
  13.   Ragnar Fyri can be contacted  by  email  (ragnar_fyri@hotmail.com)  or by
  14. snail mail at
  15.  
  16.                                Ragnar Fyri  
  17.                                Idunns vei 15
  18.                                1370 Asker   
  19.                                Norway       
  20.  
  21.   (That's Norway, Europe, not any of the cities by the same name in USA.)
  22.  
  23. ---------------------------------------------------------------------------
  24.  
  25.                                Introduction
  26.                                ------------
  27.  
  28.   The subject of this article is, as the  heading suggests, transitions. Or
  29. more precisely, still picture  transitions  programmed  in Amos. To get the
  30. vocabulary straight  first,  a  transition  is  what  happens when you stop
  31. showing one picture and  start  showing  another.  If  you have ever seen a
  32. movie (and who hasn't) :-) you should have seen several transitions, unless
  33. it happened to be "The rope" or some  other  experimental  film done all in
  34. one single shot.
  35.   The thing about transitions is that  they  can  be done in many different
  36. ways, and it is generally a good  idea  to do so. Remember when you used to
  37. visit uncle Harry, and every time you came  around he had the slide projec-
  38. tor set up and wanted to show you all the  pictures he had taken since your
  39. last visit (including those taken  during  that visit)? It was not just the
  40. subject of the show (not to mention  its  length) that was boring, but pic-
  41. tures always appeared by sliding in  from  one side and disappeared by sli-
  42. ding out to the same side. [Which,  presumably,  is why those pictures were
  43. called "slides" in the first place.] It  got slightly better when you star-
  44. ted working and got involved with your  first professional slide show. When
  45. using two projectors it is possible  to  fade  pictures in and out and even
  46. into each other by varying the light  intensity  of  the projectors. Still,
  47. there is only so much that can be  done  when  sending light through static
  48. images on transparent film.
  49.   With computer pictures, however, things start to liven up a bit. When you
  50. have stored pictures in digital form in a computer's RAM there is almost no
  51. end to what you can do with them. There  are even professional presentation
  52. programs (such as Scala) that  can  show  pictures  with all kinds of tran-
  53. sitions, but as a programmer you may  wonder  how  far it is possible to go
  54. with a homemade program. This is the question I will be trying to answer in
  55. the following.
  56.  
  57.                                   Basics
  58.                                   ------
  59.  
  60.   The details about how the Amiga  stores  and displays pictures are beyond
  61. the scope of this article, but just to give you a rough idea:
  62.   One great advantage with the Amiga is that  it can handle several screens
  63. at once. With "screen" I do not mean  monitor  or  TV screens (which I will
  64. call displays from now on just to  keep  the concepts apart), but what pro-
  65. fessionals refer to as  screen  structures.  A  screen  (structure) is dis-
  66. tinguished by its size (width,  height  and  number of colours), resolution
  67. (horizontal and vertical) and mode.  For  further details dig out your Amos
  68. manual and read the chapters about  screens  and graphics, and a bit  about
  69. Screen Open, Screen Width, Screen Height, Screen Colours and interlace mode
  70. support. In addition, screens can  have  different palettes. (Check out the
  71. Palette and Colour commands.)
  72.   Basically, there are two ways of making picture transitions on the Amiga.
  73. The first is to replace the image of one  screen with the image of another.
  74. The screens are not really changed,  and  one advantage with this method is
  75. that it does not really matter what size  or resolution the screens are, or
  76. how their palettes  are  defined,  because  they  are  treated  as separate
  77. entities and displayed on different  parts  of  the display - assuming they
  78. are displayed at all; one of the  special  features of Amos is that you can
  79. have "hidden" screens. (Read up on Screen Hide and Screen Show.) The second
  80. way is to replace the contents of  one  screen  structure with those of an-
  81. other (hidden) one, bit by  bit.  This  method  can do more advanced things
  82. than the first, but the disadvantage  is  that for it to work well, the two
  83. screens must be of the same size and  resolution,  and preferably share the
  84. same palette as  well.  [The  pictures  that  come  with  the demonstration
  85. program were specially created to  meet  these requirements, so they can be
  86. used for both methods.]
  87.  
  88.   The best way to illustrate this article  while you continue reading would
  89. be to run the program and swap  back  and  forth  between Amos and whatever
  90. reader program you are using.  So  now  I  want you to go to the Workbench,
  91. start Amos, locate the demo program,  load  and run it. Then press the Ctrl
  92. key to return to this text (assuming you didn't stop the text reader to use
  93. the Workbench, in which case you have to restart it and reload this text.)
  94.   [By the way, pressing Ctrl is not  the  "normal"  way to swap to and from
  95. Amos, I just added a little routine to make life a bit easier. I hope.]
  96.  
  97.                        1) Screen swapping transitions
  98.                       -------------------------------
  99.  
  100.   The simplest way to go from one  picture  to  another is doing what movie
  101. people call a "cut". Before everyone  started  using video, this transition
  102. was made by literally cutting and splicing  film. Go to the teddy bear pic-
  103. ture (by pressing Ctrl again) and type A to see a typical cut.
  104.  
  105.  
  106.   As you can see, it's a rather simple effect, and the code for doing it is
  107. simple too:
  108.  
  109.          Screen to Front UNSEEN
  110.  
  111.   A little explanation seems in place:  Each  screen  has a unique number -
  112. the ones used in this program are numbered  0 and 1, and numbers can be put
  113. into variables, which is just what I  have  done  here. SEEN is the visible
  114. screen, UNSEEN is the "invisible" one.  After switching them around one way
  115. or another, all that needs to be done to  set up for the next transition is
  116. to swap the two variables around:
  117.  
  118.          Swap SEEN,UNSEEN
  119.  
  120. and hey presto - even though the two  screens  now have changed roles, SEEN
  121. still points to the one you see and UNSEEN to the other! This saves you the
  122. trouble of writing two sets of all the routines! :-)
  123.  
  124. [When two screens occupy the same  coordinates  on the display, only one of
  125. them is visible (unless they are in dual  playfield mode, which is not used
  126. in this program, so just forget about it  for now). When screens are Opened
  127. or Unpacked, they are automatically placed  "in front" of any other screens
  128. that exist at the time. You can control which screen is "in front" with the
  129. commands Screen To Front and Screen  To  Back  (RTFM). The main loop of the
  130. program prepares for each transition  by  unpacking  a new screen {actually
  131. it's the same two screens that  get  reused  over  and over, but for e.g. a
  132. slide show (or perhaps it should be  called  a  transition show now? :) you
  133. would of course load and unpack new  pictures  all  the time} and "Backing"
  134. (to coin a phrase :) it, so  this  routine  makes  it visible by "Fronting"
  135. it.]
  136.  
  137.                                ----ooOoo----
  138.  
  139.   That was simple. The easiest way of  livening  it  up a bit is to use the
  140. same technique used in the  professional  slide shows I mentioned some time
  141. back: Fading. Fortunately Amos has a special command for this, and the sim-
  142. plest way to use it is to fade to black:
  143.  
  144.          Screen SEEN : Fade 5
  145.  
  146.   The first command here sets screen number SEEN to be active, to make sure
  147. that is the one that gets faded - there  is no point in fading a screen you
  148. can't see anyway! The second  command,  which is the simplest version ofthe
  149. Fade command, then fades all the screen's  colours to black with a delay of
  150. 5 between each step. [Amos measures delays and things like that in vertical
  151. blanks, which to the layman is  just  a  fancy  term for how many times per
  152. second the screen is redrawn. PAL machines use 50, NTSC machines 60.]
  153.   One thing that must be remembered when using Fade is that it is an inter-
  154. rupt driven command. During the time it  takes to finish, the program keeps
  155. executing, so if the next command should  be a cut to the unseen screen you
  156. will not see the screen fade out because  the program starts the fade, then
  157. immediately pushes the other screen to the front.
  158.   There are two ways of handling this. The  simplest way is to multiply the
  159. delay by 15 and Waiting for that long. In this case that would be
  160.  
  161.          Wait 75
  162.  
  163.   Why 15? some beginners may ask. Because  the number after Fade (5 in this
  164. case) is the delay between each step in  the fade, and a colour may take up
  165. to 15 steps to fade into another.
  166.   A more elegant solution is to find out  which colour has a component fur-
  167. thest from the target, and wait  for  that  colour  to reach its target. In
  168. this program I have been cheating  a  bit  because  I know that colour 1 is
  169. white, which is FFF in hex. So the  fade-to-black  routine simply waits for
  170. colour 1 to become pitch black:
  171.  
  172.          Repeat : Until Colour(1)=0
  173.  
  174.   Press B to see the visible screen fade to black and cut to the other pic-
  175. ture.
  176.  
  177.   Now that could have  been  done  better,  couldn't  it?  Why not fade the
  178. second picture up from black? Sure, Fade can do that too with just one more
  179. parameter and a bit of preparation. Press C to invoke this routine:
  180.  
  181.          Screen 2 : Get Palette UNSEEN
  182.          Screen UNSEEN
  183.          For A=0 To Screen Colour-1 : Colour A,0 : Next
  184.          Gosub B : Rem Fade to black and cut
  185.          Screen SEEN : Fade 5 To 2
  186.          Repeat : Until Colour(1)=4095
  187.  
  188. Fading to black is simple, but to  fade  to anything else we need somewhere
  189. to keep the target palette. In  this  program  I  use  screen 2, which is a
  190. small (hidden) dummy screen that was opened  (and hidden away) in the setup
  191. phase. The first this routine  does  is  to  activate screen 2 and copy the
  192. unseen screen's palette to it. A  word  of  caution before we proceed: When
  193. using a screen to grab a different screen's  palette this way it is import-
  194. ant to TURN OFF THE FLASHING. [This was also done in the setup.]
  195.   Now that we have the target palette  in  a safe place, it is time to pre-
  196. pare the new screen for the  transition  by setting all its colours to 0 or
  197. black. Then I save a bit of typing and space by reusing the B routine which
  198. not only fades  the  visible  screen  to  black,  but  also  swaps  the two
  199. variables SEEN and UNSEEN and sets a flag to indicate to the main loop that
  200. a successsful transition was made  (or  in this case, is in progress). Then
  201. the new screen  is  activated  (Remember,  A  swapped  the pointers, so the
  202. Screen SEEN here does exactly the  opposite  of the same command in B! Con-
  203. fused yet?) and faded back to its  old  palette  with Fade 5 To 2, which is
  204. the second version of the Fade command. The last line then waits for colour
  205. 1 to become white.
  206.  
  207. [A little side note: Fade also has a third syntax where you have to specify
  208. each target colour manually, for example
  209.  
  210.          Fade 25,$F00,$FFF,$F
  211.  
  212. would fade the first three colours of the active screen very slowly to red,
  213. white and blue (which should awaken some  patriotic feelings in most of the
  214. intended audience :). It is not used in this program because it can be very
  215. complicated to use (well, at least  if  you consider lots of typing compli-
  216. cated). To fade in a 32-colour screen for  example, you would have to first
  217. store the target palette in several  variables  and then run a command like
  218. this one:
  219.  
  220.          Fade 5,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,
  221.          C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,30,C31
  222.  
  223. (only it would have to be on one  line!)  Yes,  you could use an array, but
  224. that would only make the storing part simpler,  you would still have to use
  225. a very long command with 33  parameters  -  as a matter of fact it would be
  226. even longer because of the brackets!  Sure,  it would be great if you could
  227. e.g. "Fade 5,HUES()", but Francois didn't think of that - maybe some future
  228. version of the language...]
  229.  
  230.                                ----ooOoo----
  231.  
  232.   Now fading to black is all very well, but  a couple of alternatives would
  233. be fine. Why not do exactly  the  opposite?  Well,  it can't be done with a
  234. slide projector, but you may recall  that  I  said some time back that any-
  235. thing  is possible on a computer. The next routine was originally developed
  236. during the early work on CreAm's slide show Heaven in Hell (or was that the
  237. other way round?) [found on  Aminet  -  look  for crm-hih in the demo/slide
  238. directory]. Our leader, who had probably been watching too many TV2 station
  239. breaks :-), wanted pictures to  change  "with  a white flash", and  I wrote
  240. the routine you can see in action with a press of the D key.
  241.  
  242.          Screen 2
  243.          For A=0 To 31 : Colour(A),4095 : Next
  244.          Screen SEEN : Fade 1 To 2
  245.          Repeat : Until Colour(0)=4095
  246.          Screen 2 : Get Palette UNSEEN
  247.          Screen UNSEEN : Get Palette SEEN
  248.          Gosub A : Fade 1 To 2
  249.          Repeat : Until Colour(0)=0
  250.  
  251.   This is more or less the  same  as  the  C  routine,  only it starts with
  252. setting screen 2 to all white (4095 is  FFF in hex), then fades the visible
  253. screen to that palette, waits for colour  0 to become white, and then shuf-
  254. fles the palettes a bit. First the  new  screen palette (which is untouched
  255. so far) is copied into screen 2 (using Get Palette which is like a one step
  256. Fade To without the delay), then it  is  replaced with the one from the old
  257. screen (which is now all white), and  then  the new screen is pushed to the
  258. front and faded back to its original colours (stored in screen 2).
  259.  
  260.   This routine is faster than the fade-to-black-and-back because our leader
  261. had asked for a white flash, so I  used  the  shortest delay available - 1.
  262. But even that was not fast enough for him  (it's really more of a flaaash),
  263. so I wrote a more intricate routine that "fades" a screen to white and back
  264. in just two steps. Press E (on  the  Amos  screen,  but I shouldn't have to
  265. repeat that any more...)
  266.  
  267.   This routine requires a little setup that is done before the main loop in
  268. the demo program:
  269.  
  270.          Dim FARGER(31,2,1) : Global FARGER(),LAYER
  271.  
  272. An array called FARGER (Norwegian  for  colours)  is dimensioned to contain
  273. the maximum number of colours for two screens  times three (I'll explain in
  274. a moment), then this and a pointer are made global because I'm going to use
  275. them in two procedures. NOTE: This effect  only works with screens 0 and 1,
  276. if you insist on using it  with  other  screens  you must either change the
  277. array's third dimension (1 here) to  the  highest screen number you want to
  278. use or do some fancy manipulation of  the  LAYER pointer whenever it's used
  279. to address the array.
  280.  
  281.   To take things in logical order, the first routine (which is called twice
  282. - once for each  screen)  simply  fetches  the  colours  from the indicated
  283. screen  and calculates new colours  that  are  halfway between the original
  284. colours and an entirely white palette. It goes like this:
  285.  
  286.          Procedure FINDCOLOURS[LAYER]
  287.             Screen LAYER : For A=0 To Screen Colour-1
  288.                RGB=Colour(A)
  289.                FARGER(A,0,LAYER)=RGB
  290.                'Time for some arithmetics
  291.                FARGER(A,2,LAYER)=$FFF
  292.                R=RGB and $F00 : G=RGB and $F0 : B=RGB and F
  293.                Add R,$F00 : Add G,$F0 : Add B,$F
  294.                R=R/2 : G=G/2 : B=B/2
  295.                R=R and $F00 : G=G and $F0 : B=B and F
  296.                FARGER(A,1,LAYER)=R+G+B
  297.             Next
  298.          End Proc
  299.  
  300. What this loop does it first to  store  the original colours into the "bot-
  301. tom" of the array (colour,0,layer), then it stores $FFF (pure white) in the
  302. "top" (color,2,layer). The next five  lines  calculate the "average" or the
  303. top and bottom colours by splitting the  colour value into its three compo-
  304. nents, averaging each with the corresponding  component of white and adding
  305. them together again.
  306.   Actually this part is brand new, the  original  program just averaged the
  307. whole number with  $FFF,  which  produced  some  strange  results. The next
  308. paragraph will try to explain the theory  behind this, if you don't want to
  309. get too involved just skip to the next paragraph.
  310.  
  311.   A colour definition on the Amiga consists  of three four-bit groups which
  312. for no sane reason that I am aware of are called "nybbles". The high nybble
  313. defines the red component, the middle the green and the low the blue. Which
  314. means that for instance pure blue is  $F  or  15, while pure red is $F00 or
  315. 3840 (15 times 256). Because the three nybbles are treated as one number by
  316. anything except for the colour  commands,   you get some weird results when
  317. trying to calculate such things as the  average of two colours. Take bright
  318. red, for instance. The hex value is  F00,  so a bit of brainstorming should
  319. lead to the conclusion that $700  would  be a darker red. But just dividing
  320. 3840 by 2 would give 1920, which is $780  - and that's more green than red!
  321. The problem is that 15  divided  by  2  is  really  7  and a half, and when
  322. working with the high or middle  nybble  of  a 12-bit number, that half be-
  323. comes an 8 in the nybble below. This  is  why each nybble is ANDed with its
  324. maximum value above to  eliminate  the  fraction.  [1920  AND 3040 is 1792,
  325. which does produce a nice dark red.]
  326.  
  327.   Okay, now we have defined the colours that  have to be flicked through in
  328. order to produce a short "flash",  actually  producing the effect should be
  329. easy:
  330.  
  331.          Procedure FAD[OPP]
  332.             If OPP Then _START=0 Else _START=2
  333.             _SLUTT=2-_START : _STEG=Sgn(_SLUTT-_START)
  334.             For A=_START To _SLUTT Step _STEG
  335.                For B=0 To Screen Colour-1 : Colour B,FARGER(B,A,Screen)
  336.                Next : Wait 3 : Wait Vbl
  337.             Next
  338.          End Proc
  339.  
  340. The routine  takes  only  one  parameter,  OPP  (Norwegian  for  up), which
  341. determines in which direction the  loop  will  run. Set OPP to True, and it
  342. changes the palette from  original  colours  to  all white, and vice versa.
  343. [The variable names START, SLUTT and STEG  are Norwegian for Start, End and
  344. Step, all of which are reserved keywords in  Amos. Actually this also shows
  345. how you can use variable names  that  otherwise  would  have been parsed as
  346. keywords by preceding them with an  underscore.  So  why didn't I call them
  347. _START, _END and  _STEP?  Good  question,let's  move  on  to something more
  348. interesting!]
  349.  
  350.                                ----ooOoo----
  351.  
  352.   I have already mentioned that the  Amiga  can handle more than one screen
  353. structure simultaneously. The new thing  is that it does not just mean sto-
  354. ring two or more screens and  switching  from  one to the other in a jiffy.
  355. You can even display two (or more!) screens at the same time [assuming they
  356. don't cover the same area on the display screen] and display just a part of
  357. a screen as well. The following transitions  show a couple of variations of
  358. this theme. Press F to see how this works:
  359.  
  360.          Auto View Off
  361.          Screen Display UNSEEN,,,,0
  362.          Auto View On
  363.          Gosub A
  364.          For A=1 To Screen Height
  365.             Screen Display SEEN,,,,A : Wait Vbl
  366.          Next
  367.  
  368. This routine first tells the graphic circuits to display 0 lines of the new
  369. screen, meaning it won't be visible at all, then switches screen and starts
  370. displaying the new screen one line at a  time. This is also the second time
  371. I use Wait Vbl, which I really should have explained one effect ago. I told
  372. you earlier that a vertical blank is just  a time unit equal to the time it
  373. takes to redraw the screen.  The  truth  is  that THE vertical blank is the
  374. brief period after a screen has been completely  drawn (on the display) and
  375. before it starts getting drawn  again.  [If you want to get real technical,
  376. it's the time the electron  beam  which  draws  the  picture takes to reset
  377. itself back at the top of the screen  after  passing  off the bottom.] Wait
  378. Vbl simply waits for this period to make sure any changes to the screen get
  379. drawn at least once before they are changed  again - a bit like waiting for
  380. your last chicken to hatch before starting to count them.
  381.  
  382.   This can also be done the other way round. Press G to see this:
  383.  
  384.          For A=Screen Height To 0 Step -1
  385.             Screen Display SEEN,,,,A : Wait Vbl
  386.          Next
  387.          Gosub A
  388.  
  389.   Which is not just "the other way round"  because the transition goes from
  390. bottom to top, but also because  while  the previous routine "unfolded" the
  391. new screen after first "folding it up"  completely and putting it up front,
  392. this one "folds up" the old  screen  before  pushing  it to the back. Check
  393. what the manual has to say about the  new  commands  to find out more. (But
  394. then you are doing that all the time, aren't you?)
  395.  
  396.   But even this is only the beginning. After exposing a screen from the top
  397. and the bottom you may wonder if  it's  possible  to do it from the middle.
  398. The answer is hidden under the H key and looks like this:
  399.  
  400.          S0=Y Hard(0)
  401.          SH=Screen Height/2
  402.          Auto View Off
  403.          Screen Display UNSEEN,,SH,,0
  404.          Auto View On
  405.          Gosub A
  406.          For A=1 To SH : Screen Display SEEN,,S0+SH-A,,A*2 : Wait Vbl
  407.          Next
  408.  
  409.   If Screen Display is a new command to you, you may have wondered what all
  410. those commas were good for.  The  answer  is  that the command controls not
  411. just how much of a  screen  is  displayed,  but  where  on the screen it is
  412. displayed as well. This  routine  changes  both  these things with a rather
  413. unusual result. It starts with  displaying  zero lines of the new screen in
  414. the middle of the old, then it pulls  the  top of the screen up at the same
  415. time as pushing the bottom of the visible  part of the screen down twice as
  416. fast (to compensate for the whole screen moving up).
  417.  
  418.   This routine is different from the previous  in that the image of the new
  419. screen moves across the display. If you  don't like this but want a similar
  420. effect where both screens appear stationary as the new one appears from the
  421. middle of the old, try this variant (key I):
  422.  
  423.          S0=Y Hard(0)
  424.          SH=Screen Height/2
  425.          Auto View Off
  426.          Screen Display UNSEEN,,SH,,0 : Screen Offset UNSEEN,,SH
  427.          Auto View On
  428.          Gosub A
  429.          For A=1 To SH
  430.             Screen Display SEEN,,S0+SH-A,,A*2
  431.             Screen Offset SEEN,,SH-A
  432.             Wait Vbl
  433.          Next
  434.  
  435. Another player called Screen Offset  has  entered the field: The Amiga lets
  436. you not only define where  a  screen  is  displayed  and  how much of it is
  437. visible, but which part of it is visible as well!
  438. [Something strange about these two  routines:  the  second seems simpler in
  439. action, but is actually slightly more complicated!]
  440.  
  441.   This concludes the chapter on what I call screen swapping transitions. If
  442. you have come this far in one  session,  I suggest taking a break and maybe
  443. experimenting a bit with your own  variants  of the different effects. Fade
  444. to red, for instance, or have the new screen roll up from the bottom, or...
  445. If you come up with some  particularly  astonishing effects, you know where
  446. to send them...
  447.  
  448.                         2) Replacement transitions
  449.                         --------------------------
  450.  
  451.   Once again, we'll start with something simple - an effect built into Amos
  452. from the beginning.
  453.  
  454.          Gosub SIMILAR
  455.          Appear UNSEEN To SEEN,133 : OK=True
  456.  
  457. Because we are now starting on a new  type  of transitions that require the
  458. two screens to have  identical  dimensions,  each  of  the routines in this
  459. chapter will start with a call to  the  subroutine SIMILAR, which checks if
  460. the two screens are you-know-what  and  exits  the program if they are not.
  461. [NOTE: The subroutine does NOT check  if  the palettes are equal - which is
  462. recommended - so be really careful if you decide to replace the graphics.]
  463.   The actual transition is done with  the  Appear command, which copies the
  464. picture from the invisible screen to the  visible one in a rather fancy way
  465. that allegedly can be  varied  infinitely  by  changing the third parameter
  466. (after the comma).  Some  numbers  don't  work  at  all, so read the manual
  467. before starting to experiment with  this.  [Personally  I prefer relatively
  468. fast transitions that don't take  more  than  ten seconds at most, and some
  469. variants of the Appear effect take  much  longer. Some don't even finish at
  470. all!]
  471.   Unless the old teacher who taught me  the  alphabet got it all wrong, the
  472. key to press for this effect should be J.
  473.  
  474.  
  475.   Okay, back to the homemade routines, which all work by replacing the con-
  476. tents of the old screen bit by bit  some  way  or another. Press K for this
  477. one:
  478.  
  479.          Gosub SIMILAR
  480.          W2=SW1/2 : W1=W2-1
  481.          H2=SH1/2 : H1=H2-1
  482.          For A=1 To W2
  483.             Screen Copy UNSEEN,W1,H1,W2,H2 To SEEN,W1,H1 : Wait Vbl
  484.             Dec W1 : Dec H1 : Inc W2 : Inc H2
  485.          Next : OK=True
  486.  
  487. The variables SW1 and SH1 were set  by  SIMILAR and stand for the width and
  488. height of the old screen, which at this point should be similar to those of
  489. the new screen (SW2 and SH2). The  routine  simply  starts in the middle of
  490. the screen and copies a larger  square  for  each loop until it reaches the
  491. full width of the screen. [It simply assumes  that the width is bigger than
  492. the height - if you some times use  screens  that  are higher than they are
  493. wide you should do some extra checking here.]
  494.   You probably noticed something missing  and something new in the two rou-
  495. tines in this chapter. There is no call  to subroutine A because two of the
  496. things it does are not  needed.  Because  these  and the following routines
  497. copy data from the new screen into  the  old  there is no point in swapping
  498. them around, and so there is no sense in rearranging the pointers (SEEN and
  499. UNSEEN) either. The one thing A does that  still needs to be done is to set
  500. the flag OK to True (to indicate a  successful  transition), and so that is
  501. done "manually" throughout this chapter.
  502.  
  503.   There are lots of ways to replace  graphic  data; here is another (key L)
  504. that the professionals call a "wipe":
  505.  
  506.          Gosub SIMILAR
  507.          For A=0 To SW1-1
  508.             Screen Copy UNSEEN,A,0,A+1,SH1 To SEEN,A,0 : Wait Vbl
  509.          Next : OK=True
  510.  
  511.   This can easily be rewritten  to  wipe  from  the right to the left (just
  512. modify the second line to make a descending loop), or you can get fancy and
  513. wipe from both sides (key M):
  514.  
  515.          Gosub SIMILAR
  516.          For A=0 To SW1/2 : B=SW1-A
  517.             Screen Copy UNSEEN,A,0,A+1,SH1 To SEEN,A,0
  518.             Screen Copy UNSEEN,B,0,B+1,SH1 To SEEN,B,0 : Wait Vbl
  519.          Next : OK=True
  520.  
  521.   If you want something even fancier, try this variant (key N):
  522.  
  523.          Gosub SIMILAR
  524.          For A=0 To SW1-4 Step 2 : B=SW1-A-3
  525.             Screen Copy UNSEEN,A,0,A+1,SH1 To SEEN,A,0
  526.             Screen Copy UNSEEN,B,0,B+1,SH1 To SEEN,B,0 : Wait Vbl
  527.          Next : OK=True
  528.  
  529.   This can also be done vertically (key O):
  530.  
  531.          Gosub SIMILAR
  532.          For A=0 To SH1-4 Step 2 : B=SH1-A-3
  533.             Screen Copy UNSEEN,0,A,SW1,A+1 To SEEN,0,A
  534.             Screen Copy UNSEEN,0,B,SW1,B+1 To SEEN,0,B : Wait Vbl
  535.          Next : OK=True
  536.  
  537. [Warning: The last two  routines  need  a  bit more work if you use screens
  538. with odd (1,3,5,7,9) widths or heights. Think about it...]
  539.   Of course ALL wipes (including ones  you  think  up yourself) may be done
  540. both horizontally and vertically,  but  I'll  leave that as an exercise for
  541. you and try something different instead.  Like the "flashover" routine this
  542. comes in two parts. The first part is set up before the main loop:
  543.  
  544.          XER=Screen Width/16 : YER=Screen Height/16 : XYER=(XER*YER)-1
  545.          Dim X(XYER),Y(XYER)
  546.          X=0 : Y=0 : For A=0 To XYER
  547.             X(A)=X : Y(A)=Y
  548.             Add X,1,0 To XER-1 : If X=0 : Inc Y : End If
  549.          Next
  550.          For SHUFFLE=1 To 5
  551.             For A=0 To XYER
  552.                Repeat
  553.                   B=Rnd(XYER)
  554.                Until B<>A
  555.                Swap X(A),X(B) : Swap Y(A),Y(B)
  556.             Next
  557.          Next
  558.  
  559. Note: This is done after the initial screens unpack to get the right dimen-
  560. sions (Screen Width and  Screen  Height).  What  this does is to divide the
  561. screen into a grid of squares and store  each square's relative coordinates
  562. (the first square is 0,0, the second  is  1,0  and so on) in an array, then
  563. shuffle that array a couple of  times.  All  is them ready for calling this
  564. little routine at the press of the P key:
  565.  
  566.          For A=0 To XYER
  567.             X1=X(A)*16 : Y1=Y(A)*16 : X2=X1+16 : Y2=Y1+16
  568.             Screen Copy UNSEEN,X1,Y1,X2,Y2 To SEEN,X1,Y1 : Wait Vbl
  569.          Next : OK=True
  570.  
  571. This goes through the coordinates in the order they ended up after the last
  572. shuffling, translates them to "real" screen coordinates and then copies the
  573. corresponding squares to the visible screen one at a time.
  574.   A little note about this and  any  other  effect  that works with squares
  575. (such as the K effect above):  Remember  that if you use interlace OR hires
  576. (but not both), squares become  rectangles  and  vice versa, so half of the
  577. 16s must be replaced with either  8  or  32.  You  can also make the effect
  578. faster or slower by changing the  size  of  the squares. For an experiment,
  579. try stopping the program and replacing all the 16s in the first line of the
  580. setup and the second line of the routine with 32. Run the program, test the
  581. routine and then replace the 32s  with  8s  or even 4s or 2s. Just remember
  582. that the array grows four times bigger every time you halve the size of the
  583. squares, so you may have to put a  Set  Buffer at the start to reserve more
  584. space for variables. (You also need a lot  of patience with size 2 squares!
  585. Size 1 squares don't work with  the  pictures  used  here because there's a
  586. limit to how big an array dimension  can  be, and 320*256 is way above that
  587. limit.) [BTW, one way of  speeding  up  the  routine if you are using small
  588. squares is to leave out  the  Wait  Vbl.  It  still  takes about 45 seconds
  589. though. But I haven't tried compiling it yet...]
  590.   The square effect can also be varied in other ways. For a simple example,
  591. try to delete (or just comment out) the  shuffle loop, and the squares will
  592. be drawn in the order they were first listed. Not very exciting, but by ar-
  593. ranging the coordinates in different  ways  you  can have the change zigzag
  594. up, down,left, right, spiral in our out etc. etc. (This would probably have
  595. to be done with coordinate  data  prepared  manually  and read in from Data
  596. lines or a data file, though.)
  597.  
  598.   That was actually my last effect, but as  an extra bonus (?) I have added
  599. yet another wipe effect that I  thought  up  while working on this article.
  600. Press Q to see it.
  601.  
  602.          Gosub SIMILAR
  603.          SEC1=SH1/3 : SEC2=SEC1*2
  604.          For A=0 To SW1-1 : B=SW1-A
  605.             Screen Copy UNSEEN,A,0,A+1,SEC1 To SEEN,A,0
  606.             Screen Copy UNSEEN,B,SEC1,B+1,SEC2 To SEEN,B,SEC1
  607.             Screen Copy UNSEEN,A,SEC2,A+1,SH1-1 To SEEN,A,SEC2
  608.          Next : OK=True
  609.  
  610.   Of course it can be even more  complicted,  but  this should be enough to
  611. get you started with making more intricate effects on your own.
  612.  
  613.                               3) A final word
  614.                               ---------------
  615.  
  616.   I mentioned Scala as an example  of  transition  programs  in  the intro-
  617. duction. While I was working  on  this  article,  Amiga Format released the
  618. program on one of their cover disks.  Assuming  that  "everybody" has it by
  619. now, I came up with a  little  challenge:  Try  to  duplicate ALL the Scala
  620. effects in Amos! Some of them have  already  been done in this article, and
  621. Norwegians have a saying that "Well  started  is  half finished", so with a
  622. bit of joint effort it shouldn't be  that  hard...  [I'm talking about just
  623. the picture transitions and not the  ways  text  appears over pictures, but
  624. who knows...?]
  625. ===========================================================================
  626.                  e . n . d .   . o . f .   . f . i . l . e
  627.  
  628.